import numpy as np  
import pandas as pd  
import plotly.express as px  
import matplotlib.pyplot as plt  
from sklearn.linear_model import LinearRegression  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.model_selection import cross_val_score  

# 读取数据  
df = pd.read_csv('设备数据.csv')  

# 数据清洗（处理缺失值）  
df['温度(℃)'].fillna(df['温度(℃)'].mean(), inplace=True)  
df['运行时间(小时)'].fillna(df['运行时间(小时)'].mean(), inplace=True)  # 新增：填充运行时间  

# 计算总故障率  
fault_rate = df['故障标记'].mean()  
print(f"总故障率：{fault_rate:.2%}")  

# 计算高温设备故障率  
high_temp_fault = df[df['温度(℃)'] > 80]['故障标记'].mean()  
print(f"高温（>80℃）设备故障率：{high_temp_fault:.2%}")  

# 计算高振动设备故障率  
high_vibration_fault = df[df['振动值(mm/s)'] > 1.5]['故障标记'].mean()  
print(f"高振动（>1.5 mm/s）设备故障率：{high_vibration_fault:.2%}")  

# 数据可视化：温度分布直方图  
plt.hist(df['温度(℃)'], bins=20, edgecolor='black')  
plt.title('设备温度分布')  
plt.xlabel('温度(℃)')  
plt.ylabel('设备数量')  
plt.savefig('温度分布.png')  
plt.show()  

# 更新报告  
with open('report.txt', 'w') as f:  
    f.write(f"总故障率：{fault_rate:.2%}\n")  
    f.write(f"高温（>80℃）设备故障率：{high_temp_fault:.2%}\n")  
    f.write(f"高振动（>1.5 mm/s）设备故障率：{high_vibration_fault:.2%}\n")  
    f.write("建议：对温度>80℃或振动值>1.5 mm/s的设备增加巡检频率。\n")  

# 振动值分布直方图  
plt.hist(df['振动值(mm/s)'], bins=20, edgecolor='black')  
plt.title('设备振动值分布')  
plt.xlabel('振动值(mm/s)')  
plt.ylabel('设备数量')  
plt.savefig('振动值分布.png')  
plt.show()  

# 温度与振动值的关系图  
plt.scatter(df['温度(℃)'], df['振动值(mm/s)'], c=df['故障标记'], cmap='coolwarm')  
plt.title('温度与振动值的关系')  
plt.xlabel('温度(℃)')  
plt.ylabel('振动值(mm/s)')  
plt.colorbar(label='故障标记')  
plt.savefig('温度与振动值关系.png')  
plt.show()  

# 更新报告  
with open('report.txt', 'a') as f:  
    f.write("\n可视化图表：\n")  
    f.write("- 温度分布.png\n")  
    f.write("- 振动值分布.png\n")  
    f.write("- 温度与振动值关系.png\n")  

# 计算温度与振动值的相关性  
correlation = df['温度(℃)'].corr(df['振动值(mm/s)'])  
print(f"温度与振动值的相关性：{correlation:.2f}")  

# 故障设备的平均温度和振动值  
fault_devices = df[df['故障标记'] == 1]  
avg_temp = fault_devices['温度(℃)'].mean()  
avg_vibration = fault_devices['振动值(mm/s)'].mean()  
print(f"故障设备的平均温度：{avg_temp:.2f}℃")  
print(f"故障设备的平均振动值：{avg_vibration:.2f} mm/s")  

with open('report.txt', 'a', encoding='utf-8') as f:  
    f.write(f"温度与振动值的相关性：{correlation:.2f}\n")  
    f.write(f"故障设备的平均温度：{avg_temp:.2f}℃\n")  
    f.write(f"故障设备的平均振动值：{avg_vibration:.2f} mm/s\n")  

# 提取故障设备数据  
fault_devices = df[df['故障标记'] == 1]  

# 训练线性回归模型  
X = fault_devices[['温度(℃)', '振动值(mm/s)']]  
y = fault_devices['运行时间(小时)']  
model = LinearRegression()  
model.fit(X, y)  

# 预测设备寿命  
df['预测寿命(小时)'] = model.predict(df[['温度(℃)', '振动值(mm/s)']])  

# 保存清洗后数据  
df.to_csv('clean_data.csv', index=False)  

# 保存预测结果  
df.to_csv('设备数据_预测.csv', index=False)  
print("设备寿命预测完成，结果已保存为 '设备数据_预测.csv'")  

# 更新报告  
with open('report.txt', 'a', encoding='utf-8') as f:  
    f.write("设备寿命预测结果已保存为 '设备数据_预测.csv'\n")  
    f.write("建议：对温度>80℃或振动值>1.5 mm/s的设备增加巡检频率。\n")  

# 使用随机森林模型  
model = RandomForestRegressor()  
scores = cross_val_score(model, X, y, cv=5, scoring='r2')  
print(f"模型 R² 分数：{scores.mean():.2f}")  

# 训练模型并预测  
model.fit(X, y)  
df['预测寿命(小时)'] = model.predict(df[['温度(℃)', '振动值(mm/s)']])  

# 生成交互式图表  
fig = px.scatter(df, x='温度(℃)', y='振动值(mm/s)', color='预测寿命(小时)',  
                 title='设备寿命预测')  
fig.write_html('设备寿命预测.html')  